#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__author__ = "Administrator"
__name__="Class_inheritance"
__date__="2016/7/13"
__time__="15:44"
"""
# 类的继承
"""
#两种叫法：父类与子类   基类与派生类
class Father:
    def __init__(self):
        self.Fname = 'fff'
    def Func(self):
        print 'father.Func'
    def Bad(self):
        print 'father.Bad'

class Son(Father):      #(Fater) 继承Father类
    def __init__(self):
        self.Sname = 'sss'
    def Bar(self):
        print 'son.bar'
    def Good(self):      #重写父类的方法
        print 'father.Bad.good'

    def Bad(self):  #继承并添加,完善父类功能
        Father.Bad(self)
        print 'son.Bad'

s1 = Son()
s1.Bar()
s1.Func()
s1.Good()
s1.Bad()
"""


# 经典类和新式类

# 调用父类的构造函数 方法一：
# 没有继承object叫经典类
"""
class Father:
    def __init__(self):
        self.Fname = 'fff'
        print 'father.__init__'


class Son(Father):  # (Fater) 继承Father类
    def __init__(self):
        self.Sname = 'sss'
        print 'son.__init__'
        Father.__init__(self)  # 调用父类的构造函数


s1 = Son()

"""
# 调用父类的构造函数  方法二：使用super，要继承object类
# 继承object的类叫新式类  ----  推荐
# 所有类都是由object类创建，调用C的接口
# Python由C开发
# 新式类和经典类的区别：Python2.2产生新式类，兼容经典类，可以限制只能调用类中的某些方法，修复了一个经典类多继承的一个bug。


class Father(object):  # 继承object类
    def __init__(self):
        self.Fname = 'fff'
        print 'father.__init__'


class Son(Father):  # (Fater) 继承Father类
    def __init__(self):
        self.Sname = 'sss'
        print 'son.__init__'
        super(Son, self).__init__()

s1 = Son()
print s1.Fname
# 继承父类的构造函数，子类就可以使用父类的动态字段,可以重写__init__方法

#经典类多继承顺序bug实验：
"""
class A:
    def __init__(self):
        print 'This is A'
    def save(self):
        print 'A.save'

class B(A):
    def __init__(self):
        print 'This is B'

class C(A):
    def __init__(self):
        print 'This is C'
    def save(self):
        print 'C.save'

class D(B,C):   #从左到右搜索,永远找不到C
    def __init__(self):
        print 'This is D'

c = D()
c.save()
# 如果使用新式类：class A(object):  则可以找到C

"""


# 多继承 -- Python独有
"""
class A(object):
    def __init__(self):
        print 'This is A'
    def save(self):
        print 'A.save'

class B(A):
    def __init__(self):
        print 'This is B'

class C(A):
    def __init__(self):
        print 'This is C'
    def save(self):
        print 'C.save'

class D(B,C):   #从左到右搜索
    def __init__(self):
        print 'This is D'

c = D()
c.save()

"""
